/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Pantallas;

import Controladores.ControladorAsistencia;
import Controladores.ControladorMarcada;
import Controladores.ControladorUsuario;
import Entidades.Asistencia;
import Entidades.Empleado;
import Entidades.Usuario;
import Expertos.ConvertirFechas;
import static java.awt.Frame.MAXIMIZED_BOTH;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.util.Date;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;

/**
 *
 * @author diego
 */
public class Login extends javax.swing.JFrame {

    Controladores.ControladorLogin controladorLogin;
    Controladores.ControladorMarcada controladorMarcada = new ControladorMarcada();
    ControladorUsuario controladorUsuario = new ControladorUsuario();
    ControladorAsistencia controladorAsistencias = new ControladorAsistencia();
    Controladores.ControladorEmpleado controladorEmpleado;
    public String usuarioLogin;
    private String clave;
    private int exito = 0;
    private Date hoy = new Date();
    private Usuario user;
    public static Empleado empleadoLogin = new Empleado();
    private Asistencia a = new Asistencia();
    private boolean marcoentrada = false;
    //Panel para mostrar la huella digital
    private JPanel fingerprintViewPanel = null;
    //Imagen de la huella actual
    private BufferedImage fingerprintImage = null;

    public Login() {
        this.user = new Usuario();

        initComponents();
        inicializar();
        controladorEmpleado.inicializarCaptura();
        this.setResizable(false);
        setVisible(true);
        //Habilitado para el perreo
        botonIngresar.setEnabled(true);
    }

    private void inicializar() {

        this.controladorEmpleado = new Controladores.ControladorEmpleado(this);
    }

    /* Crea el panel que contendrá la imagen de la huella digital
     */
    private JComponent crearPanelHuella() {
        //Crea un panel nuevo para mostrar la huella
        fingerprintViewPanel = new JPanel() {
            //Se sobreescribe el método paintComponent para habilitar la muestra de la imagen de la huella
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);

                //Si hay una imagen para ser mostrada
                if (fingerprintImage != null) {
                    //Calcula el tamaño y posición de la imagen para ser pintada
                    //el tamaño es ajustado para que ocupe todo el tamaño del panel
                    Insets insets = getInsets();
                    int transX = insets.left;
                    int transY = insets.top;
                    int width = getWidth() - getInsets().right - getInsets().left;
                    int height = getHeight() - getInsets().bottom - getInsets().top;
                    //Se dibuja la imagen
                    g.drawImage(fingerprintImage, transX, transY, width, height, null);
                    botonIngresar.setEnabled(true);
                }

            }
        };

        //Se agrega un border alrededor del panel
        fingerprintViewPanel.setBorder(new CompoundBorder(
                new EmptyBorder(2, 2, 2, 2),
                new BevelBorder(BevelBorder.LOWERED)));

        fingerprintViewPanel.setToolTipText("Imagen de la última huella capturada.");

        if (fingerprintViewPanel == null) {
            return null;
        } else {

            return fingerprintViewPanel;
        }

    }

    public void showImage(BufferedImage image) {
        //Utiliza el imageProducer para crear una imagen de la huella digital
        fingerprintImage = image;
        //Se dibuja la nueva imagen
        repaint();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        botonIngresar = new javax.swing.JButton();
        campoUsuario = new javax.swing.JTextField();
        labelUsuario = new javax.swing.JLabel();
        labelClave = new javax.swing.JLabel();
        labelLeyenda = new javax.swing.JLabel();
        campoClave = new javax.swing.JPasswordField();
        panelHuella = new javax.swing.JPanel();
        labelIngreso = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Ingreso Personal_ID");
        setBackground(new java.awt.Color(255, 255, 255));
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowActivated(java.awt.event.WindowEvent evt) {
                formWindowActivated(evt);
            }
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
            public void windowClosed(java.awt.event.WindowEvent evt) {
                formWindowClosed(evt);
            }
        });

        botonIngresar.setText("Ingresar");
        botonIngresar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonIngresarActionPerformed(evt);
            }
        });

        campoUsuario.setNextFocusableComponent(campoClave);
        campoUsuario.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                campoUsuarioKeyTyped(evt);
            }
        });

        labelUsuario.setText("Usuario:");

        labelClave.setText("Clave:");

        labelLeyenda.setForeground(new java.awt.Color(255, 0, 0));
        labelLeyenda.setText("Coloque el dedo en el escaner");

        campoClave.setToolTipText("en minúscula");
        campoClave.setNextFocusableComponent(botonIngresar);
        campoClave.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                campoClaveMouseClicked(evt);
            }
        });

        panelHuella.setLayout(new java.awt.BorderLayout());

        labelIngreso.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
        labelIngreso.setText("Ingreso Sistema Personal ID");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(46, 46, 46)
                .addComponent(panelHuella, javax.swing.GroupLayout.PREFERRED_SIZE, 183, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(labelClave)
                            .addComponent(labelUsuario))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(campoClave, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(campoUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(labelLeyenda))
                        .addGap(45, 45, 45)
                        .addComponent(botonIngresar))
                    .addComponent(labelIngreso))
                .addContainerGap(30, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(61, 61, 61)
                        .addComponent(botonIngresar, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(panelHuella, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(labelIngreso)
                        .addGap(28, 28, 28)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(labelUsuario))
                        .addGap(17, 17, 17)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelClave)
                            .addComponent(campoClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(31, 31, 31)
                        .addComponent(labelLeyenda)))
                .addGap(29, 29, 29))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void botonIngresarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonIngresarActionPerformed
        usuarioLogin = campoUsuario.getText();
        clave = String.valueOf(campoClave.getPassword());
        exito = controladorUsuario.validarUsuario(usuarioLogin, clave);
        // si usuario y clave estan vacios
        if (usuarioLogin.isEmpty() && controladorEmpleado.levanto) {
            empleadoLogin = controladorEmpleado.identificarPersona();
            if (empleadoLogin != null) {
                exito = 0;
                if (empleadoLogin.getUsuario2() == null) {
                    System.out.println("No tiene usuario asociado a la huella");
                    exito = 4;
                } else {
                    usuarioLogin = empleadoLogin.getUsuario2().getNombreUsuario();
                    System.out.println("Se logueo por huella");
                }
            }
            if (empleadoLogin == null) {
                exito = 3;
            }
        }
        if (usuarioLogin.isEmpty() && empleadoLogin == null) {
            exito = 3;
        }
        if (exito == 2) {
            exito = 3;
        }
        switch (exito) {
            case 0:
                controladorEmpleado.finalizarCaptura();
                user = controladorUsuario.buscarUsuarioNombre(usuarioLogin).get(0);
                empleadoLogin = user.getIdEmpleado();
                //////Generar la Marcada por el exito del Login
                controladorMarcada.marcar(hoy, hoy, empleadoLogin, empleadoLogin.getIdOficina().getEscanerHuellas().get(0));
                //// REGISTRAR ASISTENCIA CON LA MARCADA
                List<Asistencia> asistenciaLista = empleadoLogin.getAsistenciaLista();
                for (Asistencia asistencia : asistenciaLista) {
                    if (ConvertirFechas.fechaAString(asistencia.getFechaEntradaAsistencia()).equals(ConvertirFechas.fechaAString(hoy))) {
                        marcoentrada = true;
                        System.out.println("Ya marco entrada");
                        Principal principal = new Principal((Usuario) user);
                        principal.setVisible(true);
                        principal.setExtendedState(MAXIMIZED_BOTH);
                        this.dispose();
                    }
                }
                if (!marcoentrada) {
                    //Crear la  asistencia
                    a.setFechaEntradaAsistencia(hoy);
                    a.setHsEntrada(hoy);
                    a.setIdEmpleado(empleadoLogin);
                    a.setObservacion(user.getNombreUsuario());
                    controladorAsistencias.cargarEntrada(a);
                    empleadoLogin.setAsistenciaLista(controladorAsistencias.buscarAsistenciaID(empleadoLogin));
                    Principal principal = new Principal((Usuario) user);
                    principal.setVisible(true);
                    principal.setExtendedState(MAXIMIZED_BOTH);
                    this.setVisible(false);
                    ExitoLoginout cartelExito = new ExitoLoginout(this, true, "Asistencia registrada con éxito!!");
                    this.dispose();
                }
                break;
            case 1:
                JOptionPane.showMessageDialog(null, "Contraseña incorrecta", "Ingreso al Sistema", 2);
                break;
            case 3:
                JOptionPane.showMessageDialog(null, "Usuario no valido. Coloque nuevamente el dedo en el escaner o escriba usuario y contraseña", "Ingreso al Sistema", 0);
                break;
            case 4:
                JOptionPane.showMessageDialog(null, "El empleado: " + empleadoLogin.getApellido() + ", " + empleadoLogin.getNombre() + "  No tiene un usuario asociado a su huella", "Ingreso al Sistema", 0);
                break;
        }

    }//GEN-LAST:event_botonIngresarActionPerformed

    private void formWindowActivated(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowActivated
        this.panelHuella.add(this.crearPanelHuella());
    }//GEN-LAST:event_formWindowActivated

    private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed
        // TODO add your handling code here:
    }//GEN-LAST:event_formWindowClosed

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        int resultado = JOptionPane.showOptionDialog(null, "¿Desea salir sin registrar asistencia?", "Registrar Asistencia", 2, 1, null, null, null);
        if (resultado == JOptionPane.OK_OPTION) {
            controladorEmpleado.finalizarCaptura();
            System.exit(1);
        }
    }//GEN-LAST:event_formWindowClosing

    private void campoUsuarioKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_campoUsuarioKeyTyped
        botonIngresar.setEnabled(true);
    }//GEN-LAST:event_campoUsuarioKeyTyped

    private void campoClaveMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_campoClaveMouseClicked
        botonIngresar.setEnabled(true);
    }//GEN-LAST:event_campoClaveMouseClicked
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonIngresar;
    private javax.swing.JPasswordField campoClave;
    private javax.swing.JTextField campoUsuario;
    private javax.swing.JLabel labelClave;
    private javax.swing.JLabel labelIngreso;
    private javax.swing.JLabel labelLeyenda;
    private javax.swing.JLabel labelUsuario;
    private javax.swing.JPanel panelHuella;
    // End of variables declaration//GEN-END:variables

    public JTextField getCampoClave() {
        return campoClave;
    }

    public void setCampoClave(JPasswordField campoClave) {
        this.campoClave = campoClave;
    }

    public JLabel getLabelClave() {
        return labelClave;
    }

    public void setLabelClave(JLabel labelClave) {
        this.labelClave = labelClave;
    }

    public JLabel getLabelLeyenda() {
        return labelLeyenda;
    }

    public void setLabelLeyenda(JLabel labelLeyenda) {
        this.labelLeyenda = labelLeyenda;
    }

    public JLabel getLabelUsuario() {
        return labelUsuario;
    }

    public void setLabelUsuario(JLabel labelUsuario) {
        this.labelUsuario = labelUsuario;
    }

    public JButton getBotonIngresar() {
        return botonIngresar;
    }

    public void setBotonIngresar(JButton botonIngresar) {
        this.botonIngresar = botonIngresar;
    }

    public JTextField getCampoLogin() {
        return campoClave;
    }

    public void setCampoLogin(JPasswordField campoLogin) {
        this.campoClave = campoLogin;
    }

    public JTextField getCampoUsuario() {
        return campoUsuario;
    }

    public void setCampoUsuario(JTextField campoUsuario) {
        this.campoUsuario = campoUsuario;
    }
}
